/***********************************************************************************
 * 文件名： CMS32F0301_Config.h
 * 作者： 黄均铭
 * 版本： 1
 * 说明：
 * 		CMS32F0301 统一配置文件。
 * 历史记录：
 * 2024年1月8日：初始版本。黄均铭
 ***********************************************************************************/
#ifndef _CMS32F0301_CONFIG_H_
#define _CMS32F0301_CONFIG_H_

/////////////////////////////////////////////////////////////////////////////////////
// 外设的初始参数配置，调用相应的初始化函数后将按照以下参数进行初始化，如需运行过程中修改参数
// 调用对应驱动的API即可。对于不使用的外设（不调用Init函数）可以不必理会其配置参数。
/////////////////////////////////////////////////////////////////////////////////////

#define F_HCLK 48 // MHz

#define _MCU_PER_CLK_EN_DEFAULT     SYS_CLK_ADCB_MSK|SYS_CLK_SSP_MSK|SYS_CLK_UART1_MSK|SYS_CLK_TIMER01_MSK|SYS_CLK_TIMER23_MSK|SYS_CLK_WDT_MSK

//////////////////////// SysTick 的配置

#define SYSTICK_VALUE (10 * 1000l * F_HCLK) // 1~0xFFFFFF

/////////////////////// Delay的配置

#define DELAY_TIM_INIT                     // Delay 所使用的定时器初始化，如果在别处初始化了这里留空。
#define DELAY_COUNTER      SysTick->VAL    // 计数寄存器，默认是递减计数。
#define DELAY_COUNT_PERIOD (1000 * F_HCLK) // 计数周期（重载值）,这里不是设置，只是告知延时驱动定时器的重载值。
#define DELAY_COUNT_PER_US F_HCLK          // 1us 的计数个数 （计数的频率，单位MHz. SysTick会被库函数设置为HCLK）

/////////////////////// ADC 初始参数配置

#define ADC_DIV     5  // 0~7 ADC时钟分频 = 2^ADC_DIV , Fadc = PCLK / 2^ADC_DIV = 48MHz/64 = 0.75MHz
#define ADC_NSMP    5  // 5~255 ADC采样周期，ADC转换周期 = 采样周期 + 39，45T / 0.75MHz = 60us
#define ADC_VS      0  // 0~1 ADC参考电压：电源电压，外部AVREFP
#define ADC_ICHS    0  // 内部通道30选择： 0-1.2V 5-VSS 6-VDD 7-VSS(ADC参考负端)
#define ADC_DEFAULT 30 // 默认通道选择
#define ADC_ENABLE  1  // 1-初始化后ADC默认使能
#define ADC_DELAY   16 // 某些特殊时候需要延时，单位：us

/////////////////////// SPI 初始参数配置 固定为主模式（从模式暂不支持），中断不开启，片选不控制

#define SPI_DIVM 0 // 0~255 SPI时钟分频 = PCLK /（（M+1）×N）
#define SPI_DIVN 2 // 2~254的偶数 SPI时钟分频 = PCLK /（（M+1）×N） , Fspi = 48MHz / (7 + 1) * 6 = 1MHz
#define SPI_DSS  8 // 4~16 SPI数据位数，右对齐，MSB（高位）优先发送，8级FIFO
#define SPI_CPO  0 // SPI时钟空闲电平 0：低电平 1：高电平
#define SPI_CPH  0 // SPI数据相位 0：第一个时钟边缘采样数据 1：第二个时钟边缘采样数据

/////////////////////// TIM 初始参数配置 固定为周期计数模式，32bit模式，递减计数

#define TIM0_PRS         0    // 0~2,预分频：1,16,256。
#define TIM0_CYCLE       2400 // 32bits 大于0整数 设置定时器周期时钟数
#define TIM0_RELOAD_MODE 1    // 周期改变生效方式 1:下一个周期生效，0:立刻生效，并马上按照新的周期计数
#define TIM0_IE          1    // 1:开启中断,0:不开启中断
#define TIM0_RUN         1    // 1-初始化后立即运行，0-初始化后不运行

#define TIM1_PRS         0   // 0~2,预分频：1,16,256。
#define TIM1_CYCLE       100 // 32bits 大于0整数 设置定时器周期时钟数
#define TIM1_RELOAD_MODE 1   // 周期改变生效方式 1:下一个周期生效，0:立刻生效，并马上按照新的周期计数
#define TIM1_IE          0   // 1:开启中断,0:不开启中断
#define TIM1_RUN         1   // 1-初始化后立即运行，0-初始化后不运行

#define TIM2_PRS         0   // 0~2,预分频：1,16,256。
#define TIM2_CYCLE       100 // 32bits 大于0整数 设置定时器周期时钟数
#define TIM2_RELOAD_MODE 1   // 周期改变生效方式 1:下一个周期生效，0:立刻生效，并马上按照新的周期计数
#define TIM2_IE          0   // 1:开启中断,0:不开启中断
#define TIM2_RUN         1   // 1-初始化后立即运行，0-初始化后不运行

#define TIM3_PRS         0   // 0~2,预分频：1,16,256。
#define TIM3_CYCLE       100 // 32bits 大于0整数 设置定时器周期时钟数
#define TIM3_RELOAD_MODE 1   // 周期改变生效方式 1:下一个周期生效，0:立刻生效，并马上按照新的周期计数
#define TIM3_IE          0   // 1:开启中断,0:不开启中断
#define TIM3_RUN         1   // 1-初始化后立即运行，0-初始化后不运行

//////////////////////// UART 的配置

#define UART0_BAUD_RATE     3333        // 初始波特率 
#define UART0_RIEN          1           // 1：开启接收中断；0：不开启
// #define UART0_EN_TXBUFF     0           // 1: 开启发送缓存（发送中断）；0：不开启。开启后发送数据只是填充缓存，不用死等。
//     #define UART0_TXBUFF_SIZE   128
// #define _UART0_USE_HALF_DUPLEX          // 定义表示使用半双工模式，不定义使用默认的全双工模式
    #define _UART0_PIN_TX_MODE GPIO_P01_SEL_GPIO_P01    // IO口切换成发送模式。当UART支持硬件半双工自动切换收发时定义为空。
    #define _UART0_PIN_RX_MODE GPIO_P01_SEL_UART0_RXD   // IO口切换成接收模式。当UART支持硬件半双工自动切换收发时定义为空。

#define UART1_BAUD_RATE     115200        // 初始波特率 
#define UART1_RIEN          1           // 1：开启接收中断；0：不开启
// #define UART1_EN_TXBUFF     0           // 1: 开启发送缓存（发送中断）；0：不开启。开启后发送数据只是填充缓存，不用死等。
//     #define UART1_TXBUFF_SIZE   128
//#define _UART1_USE_HALF_DUPLEX           // 定义表示使用半双工模式，不定义使用默认的全双工模式
    #define _UART1_PIN_TX_MODE  GPIO_P01_SEL_UART1_TXD;M0P_GPIO->P0DIR = 0XFFFFFFFD/*GPIO_DIR_OUTPUT(0, 1)*/;GPIO_P02_SEL_GPIO_P02;   // IO口切换成发送模式。当UART支持硬件半双工自动切换收发时定义为空。
    #define _UART1_PIN_RX_MODE  M0P_GPIO->P0DIR = 0XFFFFFFFF/*GPIO_DIR_INPUT(0, 1)*/;GPIO_P01_SEL_GPIO_P01;GPIO_P02_SEL_UART1_RXD;   // IO口切换成接收模式。当UART支持硬件半双工自动切换收发时定义为空。

////////////////////////////// WDT 初始参数配置

#define _WDT_ENABLE         1           // 1：启用看门狗，目前看门狗有问题，不能启用；不启用休眠时不进行负载检测
#define _WDT_TIME_PRS       0           // 看门狗时钟分频，0~2分别表示 1、16、256分频，看门狗时钟源：40KHz
#define _WDT_TIME_CYCLE     (40 * 500)  // 看门狗计时周期，1~4294967295，具体时间：Tms = 16 ^ PRS / 40 * CYCLE = 1ms
#define _WDT_TIME_INIT      500         // 看门狗初始间隔周期，单位：ms
#define _MCU_AWAKEN_TIME    26          // 休眠唤醒间隔，单位：ms，注：间隔时间由芯片wdt决定，需自己计算

// IO口复用举例：
// SYS_SET_IOCFG(IOP14CFG, SYS_IOCFG_P14_MOSI);
// SYS_SET_IOCFG(IOP13CFG, SYS_IOCFG_P13_MISO);
// SYS_SET_IOCFG(IOP12CFG, SYS_IOCFG_P12_SCLK);

#endif
